package com.itany.ums.action;

import java.util.Scanner;

import com.itany.ums.constant.RoleEnum;
import com.itany.ums.entity.User;
import com.itany.ums.exception.EmailEmptyException;
import com.itany.ums.exception.EmailExistsException;
import com.itany.ums.exception.EmailWrongException;
import com.itany.ums.exception.LoginnameEmptyException;
import com.itany.ums.exception.LoginnameOrPasswordWrongException;
import com.itany.ums.exception.PasswordEmptyException;
import com.itany.ums.exception.PasswordWrongException;
import com.itany.ums.exception.PhoneEmptyException;
import com.itany.ums.exception.PhoneExistsException;
import com.itany.ums.exception.PhoneNumWrongException;
import com.itany.ums.exception.UserLockedException;
import com.itany.ums.exception.UsernameEmptyException;
import com.itany.ums.exception.UsernameExistsException;
import com.itany.ums.service.UserService;
import com.itany.ums.service.impl.UserServiceImpl;
import com.itany.ums.vo.Result;
import com.itany.ums.vo.UserVo;

// 负责与用户交互
public class UserAction {

	private UserService service = new UserServiceImpl();

	private User loginUser;

	public void menu() {
		while (true) {
			System.out.println("1. 注册");
			System.out.println("2. 登录");
			System.out.println("0. 退出");
			System.out.println("请选择");
			switch (new Scanner(System.in).nextLine()) {
				case "1":
					register();
					break;
				case "2":
					login();
					break;
				case "0":
					System.out.println("再见!");
					// return;
					// System.exit(0);
					Runtime.getRuntime().exit(0);
				default:
					System.out.println("选择错误");
			}
		}
	}

	// 登录
	private void login() {

		// 与用户交互, 获取用户录入数据
		System.out.println("请输入用户名/手机号码/邮箱");
		String loginname = new Scanner(System.in).nextLine();
		System.out.println("请输入密码");
		String password = new Scanner(System.in).nextLine();

		// 将数据交给service进行业务处理
		// 通过service层的对象引用调用service的方法
		// 通过方法的参数向service传递数据
		// action拿到service的处理结果, 再根据结果进行下一步交互
		

		try {
			loginUser = service.login(loginname, password);
			// 根据登录用户的角色选择进入不同菜单
			if (loginUser.getRole().equals(RoleEnum.NORMAL.getRoleCode())) {
				userMenu();
			} else {
				adminMenu();
			}
		} catch (LoginnameEmptyException e) {
			System.out.println("登录名不可为空");
		} catch (PasswordEmptyException e) {
			System.out.println("密码不可为空");
		} catch (LoginnameOrPasswordWrongException e) {
			System.out.println("登录名或密码错误");
		} catch (UserLockedException e) {
			System.out.println("该用户已被锁定");
		}

		// ======================================================================================
		//		System.out.println(loginUser.getId() + ", " + loginUser.getUsername() + ", " + loginUser.getPhone() + ", " + loginUser.getEmail());
		//		loginUser.setUsername("aaa");
		//		System.out.println(loginUser.getId() + ", " + loginUser.getUsername() + ", " + loginUser.getPhone() + ", " + loginUser.getEmail());
		//
		//		System.out.println("-----");
		//		for (int i = 0; i < Datasource.users.length; i++) {
		//			System.out.println(Datasource.users[i].getUsername());
		//		}
		// 对action中的loginUser修改用户名, 数据库里的数据也跟着变了
		// 数据库中数据的变动, 应当通过dao操作才能改变
		// ======================================================================================

		

		// 在编写action层代码时
		// 只考虑如何与用户交互, 不去关心业务怎么处理

	}

	// 管理员菜单
	private void adminMenu() {
		do {
			System.out.println("1. 查看所有普通用户信息");
			System.out.println("2. 修改用户状态");
			System.out.println("3. 退出登录");
			System.out.println("请选择");
			switch (new Scanner(System.in).nextLine()) {
				case "1":
					showAllNormal();
					break;
				case "2":
					modifyUserState();
					break;
				case "3":
					loginUser = null;
					return;
				default:
					System.out.println("选择错误");
			}
		} while (true);
	}

	// 修改用户状态
	private void modifyUserState() {
		// 让管理员选择要操作的目标用户
		// 怎么选择? 以用户id来选择
		System.out.println("请输入用户ID");

		// 凡是遇到用户输入的操作, 一律使用字符串接收输入
		String idStr = new Scanner(System.in).nextLine();
		// 对用户录入的数据进行验证, 如果需要, 再进行类型转换
		if (!idStr.matches("\\d+")) {
			System.out.println("请输入正确的ID值");
			return;
		}
		long id = Long.parseLong(idStr);
		// 将验证后的id提交给service进行业务处理
		Result res = service.modifyUserState(id);
		System.out.println(res.getMessage());
	}

	// 查看所有普通用户信息

	private void showAllNormal() {

		User[] normal = service.findAllNormal();
		for (int i = 0; i < normal.length; i++) {
			User u = normal[i];
			System.out.println(u.getId() + ", " + u.getUsername() + ", " + u.getPhone() + ", " + u.getEmail() + ", " + u.getRoleName() + ", " + u.getStateName());
		}

	}

	// 普通用户菜单

	// 普通用户菜单
	private void userMenu() {
		do {
			System.out.println("1. 查看个人信息");
			System.out.println("2. 修改密码");
			System.out.println("3. 修改基本信息");
			System.out.println("4. 退出登录");
			System.out.println("请选择");
			switch (new Scanner(System.in).nextLine()) {
				case "1":
					showInfo();
					break;
				case "2":
					if (modifyPassword()) {
						System.out.println("密码修改成功, 请重新登录");
						loginUser = null;
						return;
					}
					break;
				case "3":
					modifyInfo();
					break;
				case "4":
					loginUser = null;
					return;
				default:
					System.out.println("选择错误");
			}
		} while (true);
	}

	// 修改基本信息
	private void modifyInfo() {
		System.out.println("1. 修改用户名");
		System.out.println("2. 修改手机号码");
		System.out.println("3. 修改邮箱");
		System.out.println("请选择");
		switch (new Scanner(System.in).nextLine()) {
			case "1":
				modifyUsername();
				break;
			case "2":
				modifyPhone();
				break;
			case "3":
				modifyEmail();
				break;
			default:
				System.out.println("选择错误");
		}
	}

	// 修改邮箱
	private void modifyEmail() {

	}

	// 修改手机号码
	private void modifyPhone() {

	}

	// 修改用户名
	private void modifyUsername() {
		System.out.println("请输入新用户名");
		String username = new Scanner(System.in).nextLine();
		Result res = service.modifyUsername(loginUser.getId(), username);
		if (res.isSuccess()) {
			loginUser.setUsername(username);
		}
	}

	// 某个需求描述不详细, 存在多种处理可能, 且都能合理解释
	// 去找领导, 将需求明确, 不要自己猜着写, 除非你领导说你看着办

	// 修改密码
	private boolean modifyPassword() {
		System.out.println("请输入旧密码");
		String oldPwd = new Scanner(System.in).nextLine();
		if (!loginUser.getPassword().equals(oldPwd)) {
			System.out.println("旧密码不正确");
			return false;
		}
		System.out.println("请输入新密码");
		String newPwd = new Scanner(System.in).nextLine();
		System.out.println("请再次输入新密码");
		String rePwd = new Scanner(System.in).nextLine();

		// 新密码是否为空, 两次密码是否一致
		// 执行该验证时, 不牵涉数据操作(不需要去数据库做查询)
		// 属于数据有效性验证, 可以在action执行
		// 当确定数据有效, 才传递到service进行更进一步的业务逻辑处理\
		if (newPwd == null || newPwd.isEmpty()) {
			System.out.println("新密码不可为空");
			return false;
		}

		if (!newPwd.equals(rePwd)) {
			System.out.println("再次密码不一致");
			return false;
		}

		Result res = service.modifyPwd(loginUser.getId(), newPwd);
		System.out.println(res.getMessage());
		return res.isSuccess();
	}

	// 查看个人信息
	private void showInfo() {
		System.out.println(loginUser.getId() + ", " + loginUser.getUsername() + ", " + loginUser.getPhone() + ", " + loginUser.getEmail());
		//		for (int i = 0; i < Datasource.users.length; i++) {
		//			System.out.println(Datasource.users[i].getUsername());
		//		}
	}

	private void register() {
		System.out.println("请输入用户名");
		String username = new Scanner(System.in).nextLine();

		System.out.println("请输入密码");
		String password = new Scanner(System.in).nextLine();

		System.out.println("请再次输入密码");
		String rePassword = new Scanner(System.in).nextLine();

		System.out.println("请输入手机号码");
		String phone = new Scanner(System.in).nextLine();

		System.out.println("请输入邮箱");
		String email = new Scanner(System.in).nextLine();

		// action通过与用户交互, 获取到用户录入的数据
		// 要将这些数据交给service进行注册功能的处理
		UserVo vo = new UserVo(username, password, rePassword, phone, email);
		try {
			service.register(vo);
			System.out.println("注册成功");
		} catch (UsernameEmptyException e) {
			// e.printStackTrace();
			System.out.println("注册失败, 用户名不可为空");
		} catch (PhoneNumWrongException e) {
			// e.printStackTrace();
			System.out.println("注册失败, 手机号码格式不正确");
		} catch (PasswordEmptyException e) {
			// e.printStackTrace();
			System.out.println("密码不可为空");
		} catch (PasswordWrongException e) {
			// e.printStackTrace();
			System.out.println("两次密码不一致");
		} catch (PhoneEmptyException e) {
			// e.printStackTrace();
			System.out.println("手机号码不可为空");
		} catch (EmailEmptyException e) {
			// e.printStackTrace();
			System.out.println("邮箱不可为空");
		} catch (EmailWrongException e) {
			// e.printStackTrace();
			System.out.println("邮箱格式不正确");
		} catch (UsernameExistsException e) {
			// e.printStackTrace();
			System.out.println("用户名已存在");
		} catch (PhoneExistsException e) {
			// e.printStackTrace();
			System.out.println("手机号码已存在");
		} catch (EmailExistsException e) {
			// e.printStackTrace();
			System.out.println("邮箱已存在");
		}

	}

}
